package com.mmq.ets.visuel;
/******************************************************
Cours:  LOG121
Projet: Squelette du laboratoire #1
Nom du fichier: FenetrePrincipale.java
Date créé: 2013-05-03
*******************************************************
Historique des modifications
*******************************************************
*@author Patrice Boucher
2013-05-03 Version initiale
*******************************************************/  

import java.awt.BorderLayout;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JFrame;
import javax.swing.JOptionPane;

import com.mmq.ets.controleur.ControleurFrontal;
import com.mmq.ets.modele.CommBase;
import com.mmq.ets.modele.GestionaireFormes;
import com.mmq.ets.util.Labo2Const;
import com.mmq.ets.util.LangueConfig;
 
/**
 * Cette classe représente la fenêtre principale de l'application, Elle reçoit les notifications lorsque le modèle a changé
 * @author Patrice Boucher
 * @date 2013/05/04
 */
public class FenetrePrincipale extends JFrame implements Observer{
	
	private static final long serialVersionUID = -1210804336046370508L;

	
	private MenuFenetre menu;
	private ControleurFrontal monControleur;
	private static final String MESSAGE_DIALOG_CONNEXION="app.frame.dialog.connectionDialog";
	private static final String MESSAGE_ERREUR_SERVEUR_TOMBE="app.frame.dialog.serverDown";
	private static final String MESSAGE_ERREUR_PORT="app.frame.dialog.PortError";
	private static final String MESSAGE_ERREUR_DNS_INVALIDE="app.frame.dialog.DNSError";
	private static final String MESSAGE_ERREUR_CONEXION_REFUSE="app.frame.dialog.connectionError";
	private static final String MESSAGE_DIALOGUE_A_PROPOS = "app.frame.dialog.about"; 
	private static final String MENU_AIDE_PROPOS = "app.frame.menus.help.about";

	/**
	 * Contructeur
	 * @param comm référence de la connexion
	 */
	public FenetrePrincipale(CommBase commObservable,ControleurFrontal controleur, GestionaireFormes gestionaireObservable)
	{
		menu= new MenuFenetre(controleur);
		this.monControleur=controleur;
		this.setLayout(new BorderLayout());
		this.add(menu, BorderLayout.NORTH); 
		FenetreFormes fenetreFormes = new FenetreFormes();
		this.add(fenetreFormes, BorderLayout.CENTER); // Ajoute la fenêtre de forme à la fenètre principale
		this.pack(); // Ajuste la dimension de la fenêtre principale selon celle de ses composants
		this.setVisible(false); // Rend la fenêtre principale invisible.
		this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); //... à réviser selon le comportement que vous désirez ...
		commObservable.addObserver(this);//Ajout d'observateur d'attrapper les exception de la connexion
		gestionaireObservable.addObserver(fenetreFormes);// Reaffichage lorsque chaque 
		
	}
	public MenuFenetre getMenu() {
		return menu;
	}
	
	
	/**
	 * // Appelé lorsque l'utilisateur demande un connexion
	 * @param action
	 * @return String avec la réponse de l'utilisateur 
	 */
	public String afficherReponseDialog(Labo2Const.Actions action)
	{
		switch (action)
		{
			case AFFICHER_DIALOGUE_CONNEXION :
			{
				return JOptionPane.showInputDialog(this,LangueConfig.getResource(MESSAGE_DIALOG_CONNEXION), "localhost:10000");
			}
			case AFFICHER_AIDE:
			{
				JOptionPane.showMessageDialog(null,  LangueConfig.getResource(MESSAGE_DIALOGUE_A_PROPOS), 
						LangueConfig.getResource(MENU_AIDE_PROPOS), JOptionPane.INFORMATION_MESSAGE);
			}
			default:
			break;
		}
		return null;
	}
	/**
	 * Appelé lorsque le modèle a changé
	 */
	@Override
	public void update(Observable arg0, Object arg1) 
	{
		//Déclanchée si le port n'est pas numérique
		if(arg1==Labo2Const.ProprietesChangees.ERREUR_NO_INT)
		{
			JOptionPane.showMessageDialog(this,LangueConfig.getResource(MESSAGE_ERREUR_PORT));
			if(monControleur!=null)
				monControleur.faireAction(Labo2Const.Actions.AFFICHER_DIALOGUE_CONNEXION);
		}
		//Déclanchée si l'adresse n'est pas valide
		if(arg1==Labo2Const.ProprietesChangees.ERREUR_DNS)
		{
			JOptionPane.showMessageDialog(this,LangueConfig.getResource(MESSAGE_ERREUR_DNS_INVALIDE));
			if(monControleur!=null)
				monControleur.faireAction(Labo2Const.Actions.AFFICHER_DIALOGUE_CONNEXION);
		}
		//Déclanchée si la connexion est reussie
		if(arg1==Labo2Const.ProprietesChangees.CONNECTION_REUSSIE)
		{
			this.setVisible(true);
			monControleur.faireAction(Labo2Const.Actions.DEMARRER_THREAD);
		}
		//Déclanchée lorsque le seveur ne repond pas sur l'addresse donnée
		if(arg1 instanceof String[])	
		{
			String[] messageError=(String[])arg1;
			{
				if(messageError[0].equals(Labo2Const.ProprietesChangees.CONNECTION_REFUSE.toString()))
				JOptionPane.showMessageDialog(this,messageError[1]+" "+LangueConfig.getResource(MESSAGE_ERREUR_CONEXION_REFUSE)+" "+messageError[2]);
				if(monControleur!=null)
					monControleur.faireAction(Labo2Const.Actions.AFFICHER_DIALOGUE_CONNEXION);
			}		
		}
		if(arg1==Labo2Const.ProprietesChangees.SERVEUR_TOMBE)
		{
			JOptionPane.showMessageDialog(this,LangueConfig.getResource(MESSAGE_ERREUR_SERVEUR_TOMBE));
			monControleur.faireAction(Labo2Const.Actions.FERMER_CONNEXION);
			this.repaint();
		}
		
	}
	/**
	 * @param monControleur référence du controleur
	 */
	public void setMonControleur(ControleurFrontal monControleur) 
	{
		this.monControleur = monControleur;
	}

	
	
}
